/**
 * ControladoraBDPerfiles.java
 */

/**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.datos;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.LinkedList;
import adsec.entidades.Perfil;
import adsec.entidades.PerfilYUsuarioBD;
import adsec.entidades.Permiso;
import adsec.entidades.UsuarioBD;

public class ControladoraBDPerfiles {

    private Connection conexion;
    private AdministradorConexion adminConexion;
    
    public ControladoraBDPerfiles(){
        adminConexion = AdministradorConexion.getInstancia();
    }

    public PerfilYUsuarioBD consultarPerfil(int idPerfil){
        PerfilYUsuarioBD perfilYUsuario = null;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spConsultarPerfil(conexion, idPerfil);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    if(resultado.next())
                        perfilYUsuario = this.crearPerfil(resultado);
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return perfilYUsuario;
    }//fin de consultarEstudiante

    public LinkedList<Perfil> consultarPerfiles(){
        LinkedList<Perfil> lista = new LinkedList<Perfil>();
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spConsultarPerfiles(conexion);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    while(resultado.next()){
                        Perfil perfil = this.crearPerfilGrid(resultado);
                        lista.add(perfil);
                    }//fin de while
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return lista;
    }//fin de consultarPerfiles

    public int insertarPerfil(PerfilYUsuarioBD perfilYUsuario){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spInsertarPerfil(conexion, perfilYUsuario);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
					ResultSet resultSet = procedimiento.getResultSet();
                    if(resultSet.next() && resultSet.getInt("resultado") > 0){
						resultado = AdministradorConexion.QUERY_OK;
					}
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de insertarPerfil

    public int modificarPerfil(PerfilYUsuarioBD perfilYUsuario){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spModificarPerfil(conexion, perfilYUsuario);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de modificarPerfil

    public int eliminarPerfil(int idPerfil){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spEliminarPerfil(conexion, idPerfil);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de eliminarPerfil

    private CallableStatement spConsultarPerfil(Connection conexion, int idPerfil){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL consultarPerfil"+UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setInt(Perfil.idPerfilNC+"_p", idPerfil);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarPerfil
    
    private CallableStatement spConsultarPerfiles(Connection conexion){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL consultarPerfiles()",
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarPerfiles
    
    private CallableStatement spInsertarPerfil(Connection conexion, PerfilYUsuarioBD perfilYUsuario){
        CallableStatement procedimiento = null;
        try{
			Perfil perfil = perfilYUsuario.getPerfil();
			UsuarioBD usuarioBD = perfilYUsuario.getUsuarioBD();
            procedimiento = conexion.prepareCall("CALL insertarPerfil"+UtilidadesCapaDatos.agregarParametros(20),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			procedimiento.setString(Perfil.nombreNC+"_p", perfil.getNombre());
            procedimiento.setDate(Perfil.ultimaModificacionNC+"_p", perfil.getUltimaModificacion());
            procedimiento.setString(Perfil.permEstudiantesNC+"_p", perfil.getPermEstudiantes().toString());
            procedimiento.setString(Perfil.permResponsableNC+"_p", perfil.getPermResponsable().toString());
            procedimiento.setString(Perfil.permMateriasMatriculadasNC+"_p", perfil.getPermMateriasMatriculadas().toString());
            procedimiento.setString(Perfil.permRegistroNotasNC+"_p", perfil.getPermRegistroNotas().toString());
            procedimiento.setString(Perfil.permDocentesNC+"_p", perfil.getPermDocentes().toString());
            procedimiento.setString(Perfil.permDocenteImparteNC+"_p", perfil.getPermDocenteImparte().toString());
            procedimiento.setString(Perfil.permMatriculaNC+"_p", perfil.getPermMatricula().toString());
            procedimiento.setString(Perfil.permNivelesSeccionesNC+"_p", perfil.getPermNivelesSecciones().toString());
            procedimiento.setString(Perfil.permMateriasNC+"_p", perfil.getPermMaterias().toString());
            procedimiento.setString(Perfil.permAsistenciaNC+"_p", perfil.getPermAsistencia().toString());
            procedimiento.setString(Perfil.permPersonalAdmNC+"_p", perfil.getPermPersonalAdm().toString());
            procedimiento.setString(Perfil.permComiteNC+"_p", perfil.getPermComite().toString());
            procedimiento.setString(Perfil.permReportesNC+"_p", perfil.getPermReportes().toString());
            procedimiento.setString(Perfil.permConfiguracionNC+"_p", perfil.getPermConfiguracion().toString());
            procedimiento.setString(Perfil.permUsuariosNC+"_p", perfil.getPermUsuario().toString());
            procedimiento.setString(Perfil.permPerfilesNC+"_p", perfil.getPermPerfiles().toString());
			procedimiento.setString(UsuarioBD.nombreNC+"_p", usuarioBD.getNombre());
			procedimiento.setBytes(UsuarioBD.passwordNC + "_p", usuarioBD.getPasswordEncriptado());

        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spInsertarPerfil

    private CallableStatement spModificarPerfil(Connection conexion, PerfilYUsuarioBD perfilYUsuario){
        CallableStatement procedimiento = null;
        try{
			Perfil perfil = perfilYUsuario.getPerfil();
			UsuarioBD usuarioBD = perfilYUsuario.getUsuarioBD();
            procedimiento = conexion.prepareCall("CALL modificarPerfil"+UtilidadesCapaDatos.agregarParametros(21),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setInt(Perfil.idPerfilNC+"_p", perfil.getIdPerfil());
            procedimiento.setString(Perfil.nombreNC+"_p", perfil.getNombre());
            procedimiento.setDate(Perfil.ultimaModificacionNC+"_p", perfil.getUltimaModificacion());
            procedimiento.setString(Perfil.permEstudiantesNC+"_p", perfil.getPermEstudiantes().toString());
            procedimiento.setString(Perfil.permResponsableNC+"_p", perfil.getPermResponsable().toString());
            procedimiento.setString(Perfil.permMateriasMatriculadasNC+"_p", perfil.getPermMateriasMatriculadas().toString());
            procedimiento.setString(Perfil.permRegistroNotasNC+"_p", perfil.getPermRegistroNotas().toString());
            procedimiento.setString(Perfil.permDocentesNC+"_p", perfil.getPermDocentes().toString());
            procedimiento.setString(Perfil.permDocenteImparteNC+"_p", perfil.getPermDocenteImparte().toString());
            procedimiento.setString(Perfil.permMatriculaNC+"_p", perfil.getPermMatricula().toString());
            procedimiento.setString(Perfil.permNivelesSeccionesNC+"_p", perfil.getPermNivelesSecciones().toString());
            procedimiento.setString(Perfil.permMateriasNC+"_p", perfil.getPermMaterias().toString());
            procedimiento.setString(Perfil.permAsistenciaNC+"_p", perfil.getPermAsistencia().toString());
            procedimiento.setString(Perfil.permPersonalAdmNC+"_p", perfil.getPermPersonalAdm().toString());
            procedimiento.setString(Perfil.permComiteNC+"_p", perfil.getPermComite().toString());
            procedimiento.setString(Perfil.permReportesNC+"_p", perfil.getPermReportes().toString());
            procedimiento.setString(Perfil.permConfiguracionNC+"_p", perfil.getPermConfiguracion().toString());
            procedimiento.setString(Perfil.permUsuariosNC+"_p", perfil.getPermUsuario().toString());
            procedimiento.setString(Perfil.permPerfilesNC+"_p", perfil.getPermPerfiles().toString());
			procedimiento.setString(UsuarioBD.nombreNC+"_p", usuarioBD.getNombre());
			procedimiento.setBytes(UsuarioBD.passwordNC + "_p", usuarioBD.getPasswordEncriptado());
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spModificarPerfil
    
    private CallableStatement spEliminarPerfil(Connection conexion, int idPerfil){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL eliminarPerfil"+UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setInt(Perfil.idPerfilNC+"_p", idPerfil);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spEliminarPerfil
    
    private PerfilYUsuarioBD crearPerfil(ResultSet resultSet) throws SQLException{
        Perfil perfil = new Perfil();
        perfil.setIdPerfil(resultSet.getInt(Perfil.idPerfilNC));
        perfil.setNombre(resultSet.getString(Perfil.nombreNC));
        perfil.setUltimaModificacion(resultSet.getDate(Perfil.ultimaModificacionNC));
        perfil.setPermEstudiantes(new Permiso(resultSet.getString(Perfil.permEstudiantesNC)));
        perfil.setPermResponsable(new Permiso(resultSet.getString(Perfil.permResponsableNC)));
        perfil.setPermMateriasMatriculadas(new Permiso(resultSet.getString(Perfil.permMateriasMatriculadasNC)));
        perfil.setPermRegistroNotas(new Permiso(resultSet.getString(Perfil.permRegistroNotasNC)));
        perfil.setPermDocentes(new Permiso(resultSet.getString(Perfil.permDocentesNC)));
        perfil.setPermDocenteImparte(new Permiso(resultSet.getString(Perfil.permDocenteImparteNC)));
        perfil.setPermMatricula(new Permiso(resultSet.getString(Perfil.permMatriculaNC)));
        perfil.setPermNivelesSecciones(new Permiso(resultSet.getString(Perfil.permNivelesSeccionesNC)));
        perfil.setPermMaterias(new Permiso(resultSet.getString(Perfil.permMateriasNC)));
        perfil.setPermAsistencia(new Permiso(resultSet.getString(Perfil.permAsistenciaNC)));
        perfil.setPermPersonalAdm(new Permiso(resultSet.getString(Perfil.permPersonalAdmNC)));
        perfil.setPermComite(new Permiso(resultSet.getString(Perfil.permComiteNC)));
        perfil.setPermReportes(new Permiso(resultSet.getString(Perfil.permReportesNC)));
        perfil.setPermConfiguracion(new Permiso(resultSet.getString(Perfil.permConfiguracionNC)));
        perfil.setPermUsuario(new Permiso(resultSet.getString(Perfil.permUsuariosNC)));
        perfil.setPermPerfiles(new Permiso(resultSet.getString(Perfil.permPerfilesNC)));
        UsuarioBD usuarioBD = new UsuarioBD();
        usuarioBD.setNombre(resultSet.getString(UsuarioBD.nombreNC));
        usuarioBD.setPasswordEncriptado(resultSet.getBytes(UsuarioBD.passwordNC));
        PerfilYUsuarioBD perfilYUsuario = new PerfilYUsuarioBD(perfil, usuarioBD);
        return perfilYUsuario;
    }//fin de crearPerfil

    public Perfil crearPerfilGrid(ResultSet resultSet) throws SQLException{
        Perfil perfil = new Perfil();
        perfil.setIdPerfil(resultSet.getInt(Perfil.idPerfilNC));
        perfil.setNombre(resultSet.getString(Perfil.nombreNC));
        perfil.setUltimaModificacion(resultSet.getDate(Perfil.ultimaModificacionNC));
        return perfil;
    }

}//fin de la clase ControladoraBDPerfil
